package com.liuyfly.leetcode.questions;

import lombok.extern.slf4j.Slf4j;

/**
 * @author liuyangfang at 2022-09-07 10:37
 */
@Slf4j
public class Question0050 {

    /**
     * 实现 pow(x, n) ，即计算 x 的整数 n 次幂函数（即，x^n ）。
     * 
     * <pre>
    示例 1：
    输入：x = 2.00000, n = 10
    输出：1024.00000
     * </pre>
     * 
     * <pre>
    示例 2：
    输入：x = 2.10000, n = 3
    输出：9.26100
     * </pre>
     * 
     * <pre>
    示例 3：
    输入：x = 2.00000, n = -2
    输出：0.25000
    解释：2-2 = 1/22 = 1/4 = 0.25
     * </pre>
     * 
     * </br>
     * </br>
     * 链接：https://leetcode.cn/problems/powx-n
     */
    public static double myPow(double x, int n) {
        if (n == 0) {
            return 1;
        }
        if (n == 1) {
            return x;
        } else if (n == -1) {
            return 1 / x;
        }
        int middle = n / 2;
        if (n % 2 == 0) {
            if (n > 0) {
                return myPow(x * x, middle);
            } else {
                return 1 / myPow(x * x, middle * -1);
            }
        } else {
            if (n > 0) {
                return x * myPow(x * x, middle);
            } else {
                return 1 / x / myPow(x * x, middle * -1);
            }
        }
    }

    public static void main(String[] args) {
        log.info("==============pow start(by fast multiply)==============");
        log.info("result:{}", myPow(3.1, 2));
        log.info("result:{}", myPow(10, -2));
        long start = System.currentTimeMillis();
        log.info("result:{}", myPow(1, Integer.MIN_VALUE));
        long end = System.currentTimeMillis();
        log.info("cost:{}", end - start);
    }
}
